/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package Set;

import Collection接口.Person;
import org.junit.Test;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

/**
 * @description TreeSet 树集
 *  TreeSet 是 SortedSet 接口的实现类，TreeSet 可以确保集合元素处于排序状态。
 * TreeSet底层使用红黑树结构存储数据
 *  新增的方法如下： (了解)
 * Comparator comparator()
 * Object first()
 * Object last()
 * Object lower(Object e)
 * Object higher(Object e)
 * SortedSet subSet(fromElement, toElement)
 * SortedSet headSet(toElement)
 * SortedSet tailSet(fromElement)
 * TreeSet 两种排序方法：自然排序和定制排序。默认情况下，TreeSet 采用自然排序。
 *
 * @author 俊昭
 * @date 2022/4/20
*/
public class TreeSetTest {
    /**
    自然排序
     */
    @Test
    public void test01(){
        TreeSet treeSet = new TreeSet();
//        treeSet.add("AA");// 存入不同类数据会导致ClassCastException
//        treeSet.add(new Person("ZhangSan",18));
//        treeSet.add(false);

        //Integer
//        treeSet.add(122);
//        treeSet.add(344);
//        treeSet.add(233);
//        treeSet.add(144);
//        treeSet.add(133);
        /*
        122
        133
        144
        233
        344 并未按照添加顺序排列 而是升序排列
         */

        //String
//        treeSet.add("aa");
//        treeSet.add("cc");
//        treeSet.add("bb");
//        treeSet.add("AA");
//        treeSet.add("ab");
        /*
        AA
        aa
        ab
        bb
        cc 按照ASCII码值排列
         */

        //自定义对象
        treeSet.add(new Person("B",18));
        treeSet.add(new Person("C",15));
        treeSet.add(new Person("F",19));
        treeSet.add(new Person("D",20));
        // 未重写Comparable的方法会报错

        // 以年龄为标准进行排序
        //Person{name='C', age=15}
        //Person{name='B', age=18}
        //Person{name='F', age=19}
        //Person{name='D', age=20}




        Iterator iterator = treeSet.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());

        }

    }

    /**
     定制排序
     */
    @Test
    public void test02(){
        Comparator c1 = new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                if (o1==o2){
                    return 0;
                }else if(o1 instanceof Person && o2 instanceof Person){
                    Person p1 = (Person) o1;
                    Person p2 = (Person) o2;

                    return Integer.compare(p1.getAge(), p2.getAge());
                }
                throw new RuntimeException("输入类型不匹配");
            }
        };
        TreeSet treeSet = new TreeSet(c1);

        treeSet.add(new Person("B",18));
        treeSet.add(new Person("C",15));
        treeSet.add(new Person("F",19));
        treeSet.add(new Person("G",19));
        treeSet.add(new Person("D",20));

        Iterator iterator = treeSet.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());

        }
        /*
        Person{name='C', age=15}
        Person{name='B', age=18}
        Person{name='F', age=19}
        Person{name='D', age=20} // 可以看到舍弃了一个同为十九岁的 G
         */

    }
}
